//5．编写一个程序满足下面的要求。　　
//a．外部定义一个有两个成员的结构模板name：一个字符串储存名，一个字符串储存姓。　　
//b．外部定义一个有3个成员的结构模板student：一个name类型的结构，
// 一个grade数组储存3个浮点型分数，一个变量储存3个分数平均数。　　
//c．在main()函数中声明一个内含CSIZE（CSIZE=4）个student类型结构的数组，
//并初始化这些结构的名字部分。用函数执行d、e、f和g中描述的任务。　
//d．以交互的方式获取每个学生的成绩，提示用户输入学生的姓名和分数。
//把分数储存到grade数组相应的结构中。可以在main()函数或其他函数中用循环来完成。　　
//e．计算每个结构的平均分，并把计算后的值赋给合适的成员。　　
//f．打印每个结构的信息。　　
//g．打印班级的平均分，即所有结构的数值成员的平均值。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define GRADES 3
#define CSIZE 4

struct name {
    char fname[20];
    char lname[20];
};

struct student {
    struct name name;
    float grade[GRADES];
    float avgrad;
};



//获取学生成绩
void get_grade(struct student students[], int size);

//计算平均分
void calculate_avg(struct student students[], int size);

//打印结构信息
void show_students(struct student students[], int size);

//打印所有人的平均分
void show_avg_all(struct student students[], int size);


int main() {
    struct student students[CSIZE] = {
            {.name={"Tom", "Li"}},
            {.name={"Linus", "Zhang"}},
            {.name={"Allen", "Wang"}},
            {.name={"Jog", "Zhu"}},
    };
    get_grade(students, CSIZE);
    calculate_avg(students, CSIZE);
    show_students(students, CSIZE);
    show_avg_all(students, CSIZE);
    return 0;
}

void get_grade(struct student students[], int size){
    float grade;
    for (int i = 0; i < size; ++i) {
        printf("Enter the %d grades for %s,%s:", GRADES, students[i].name.fname, students[i].name.lname);
        for (int j = 0; j < GRADES; ++j) {
            while (scanf("%f", &grade) != 1 && grade < 0.0f) {
                printf("Enter a value > 0");
            }
            students[i].grade[j] = grade;
        }
    }
}

void calculate_avg(struct student students[], int size){
    for (int i = 0; i < size; ++i) {
        float count = 0.0f;
        for (int j = 0; j < GRADES; ++j) {
            count += students[i].grade[j];
        }
        students[i].avgrad = count / GRADES;
    }
}

void show_students(struct student students[], int size){
    printf("Now students info:\n");
    for (int i = 0; i < size; ++i) {
        printf("%s,%s -- %.2f\n", students[i].name.fname, students[i].name.lname, students[i].avgrad);
    }
}

void show_avg_all(struct student students[], int size){
    float sum = 0.0f;
    for (int i = 0; i < size; ++i) {
        sum += students[i].avgrad;
    }
    printf("avg of all students is:%.2f\n", sum / size);
}